# -*- coding: utf-8 -*-
import md5
from lr.register.forms import RegisterForm
from lr.register.models import RegException, Confirm
from django.http import HttpResponseRedirect
from lr.face.views import check_user
from django.shortcuts import render_to_response
from django.views.generic.simple import direct_to_template
from django.template.loader import render_to_string
from django.contrib import auth
from lr.message.models import LrMessage
from lr import settings


def register_account(request):
    """ Формирование формы регистрации нового пользователя """
    if not check_user(request):
        return render_to_response('lock_account.html')
    
    if request.user.is_authenticated():
        # Юзер залогинился из формы
        return HttpResponseRedirect('/')
    
    register_data = {}
    
    # Формирование формы регистрации
    if request.method == 'POST' \
    and 'username' in request.POST \
    and 'password1' in request.POST \
    and 'email' in request.POST \
    and 'invite' in request.POST:
        # Переданы регистрационные данные
        form = RegisterForm(request.POST)
        
        if form.is_valid():
            # Введенные данные прошли предварительную проверку
            try:
                # Попытаться создать нового пользователя
                nickname = request.POST.get('nickname', None)
                first_name = request.POST.get('first_name', None)
                patronymic = request.POST.get('patronymic', None)
                last_name = request.POST.get('last_name', None)
                
                username = request.POST['username']
                password = request.POST['password1']
                
                form.save(username=username, password=password, invite=request.POST['invite'],
                          email=request.POST['email'], nickname=nickname, first_name=first_name,
                          patronymic=patronymic, last_name=last_name,
                          send_email=settings.VALIDATE_WITH_EMAIL)
                
                # Регистрация прошла успешно, залогиниться и перейти
                # на главную страницу для отображения системного сообщения
                user = auth.authenticate(username=username, password=password)
                if user:
                    auth.login(request, user)
                return HttpResponseRedirect('message')
            except RegException as e:
                # Новый пользователь не создан, вывести предупреждение
                register_data['register_form'] = form
                register_data['header_warning_message'] = e
        else:
            # Введенные данные не прошли предварительную проверку
            register_data['register_form'] = form
    else:
        # Никаких данных не передано
        register_data['register_form'] = RegisterForm()
    
    return direct_to_template(request, 'register.html', register_data)



def confirm_account(request):
    """ Подтверждение аккаунта """
    if request.user.is_authenticated() \
    and request.user.is_active \
    and request.method == 'GET' \
    and 'code' in request.GET:
        # Пришел код на подтверждение аккаунта
        code = md5.md5(request.user.username + '#' +
                       request.user.email).hexdigest().decode('utf-8')
        if request.GET['code'] == code:
            # Код совпадает с расчетным значением
            confirms = Confirm.objects.filter(user=request.user)
            try:
                confirms.get(confirm=code)
                # Найден код, соответствующий пришедшему в запросе
                confirms.delete()
                # Сгенерировать системное сообщение об успешном завершении регистрации
                LrMessage.objects.create_message(request.user, u'Регистрация завершена',
                                                 render_to_string('messages/registration_message.html'))
                return HttpResponseRedirect('message')
            except:
                pass
        
    return HttpResponseRedirect('/')
